package DoublyLinkedList

import "utils/iterator"

// listIterator 是双向链表的迭代器实现，用于操作链表节点。
type listIterator[T any] struct {
	ptr *node[T] // 指向当前节点的指针。
}

// NewIterator 创建一个新的迭代器，初始指向指定的节点。
func NewIterator[T any](ptr *node[T]) *listIterator[T] {
	return &listIterator[T]{
		ptr: ptr,
	}
}

// IsValid 检查迭代器是否有效，如果当前指向的节点不为 nil，则表示有效。
func (iter *listIterator[T]) IsValid() bool {
	return iter.ptr != nil
}

// Next 将迭代器移动到下一个节点并返回更新后的迭代器。
func (iter *listIterator[T]) Next() iterator.ConstIterator[T] {
	if iter.ptr != nil {
		iter.ptr = iter.ptr.Next() // 移动到下一个节点。
	}
	return iter
}

// Prev 将迭代器移动到上一个节点并返回更新后的迭代器。
func (iter *listIterator[T]) Prev() iterator.ConstBidIterator[T] {
	if iter.ptr != nil {
		iter.ptr = iter.ptr.Prev() // 移动到上一个节点。
	}
	return iter
}

// GetValue 返回当前节点的值。如果节点为空，抛出 panic。
func (iter *listIterator[T]) GetValue() T {
	if iter.ptr == nil {
		panic("invalid iterator") // 当前节点为空，无法获取值。
	}
	return iter.ptr.value
}

// SetValue 设置当前节点的值。如果节点为空，什么也不做。
func (iter *listIterator[T]) SetValue(val T) {
	if iter.ptr != nil {
		iter.ptr.value = val // 设置节点值。
	}
}

// Equal 比较当前迭代器和另一个迭代器是否指向相同的节点。
func (iter *listIterator[T]) Equal(other iterator.ConstIterator[T]) bool {
	otherIter, ok := other.(*listIterator[T])
	if !ok {
		return false // 如果类型不匹配，返回 false。
	}
	return otherIter.ptr == iter.ptr // 判断两个迭代器是否指向同一个节点。
}
